iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
Mobile Development

30天用React native製作app!!系列 第 23

[蚊子的Day23]記錄上次關閉前的畫面~React Native

  • 分享至 

  • xImage
  •  

上篇說到將狀態變數記錄在手機端裡,其實不止狀態變數,上次關閉前的頁面也可以被記錄下來。

在<NavigationContainer>標籤有個參數名為onStateChange,每當進行頁面切換之後,React Native會在onStateChange輸出目前的導覽頁面參數,利用此參數就可恢復上次開啟得畫面。

  • 首先開啟App.js檔案,並在裡面新增兩個狀態變數,一個用來記錄導覽頁面,一個用來記錄導覽元件的狀態變數完成記錄與否
    const [initialNavigationState, setInitialNavigationState] = React.useState();
    const [isLoadingComplete, setLoadingComplete] = React.useState(false);
    
  • 接下來在<NavigationContainer>標籤設定initialState與onStateChange參數
    <NavigationContainer
          initialState={initialNavigationState}
          onStateChange={(state) =>
            AsyncStorage.setItem('PERSISTENCE_KEY', JSON.stringify(state))
          }
    >
          <MainTabNavigator />
    </NavigationContainer>
    
    *小提示:我們可以在onStateChange直接儲存導覽頁面的狀態變數是因為React Navigation會在頁面狀態變數設定完畢之後才執行onStateChange指定的函數。
  • 之後來設定在第一次渲染畫面之後載入導覽元件的狀態變數
    React.useEffect(() => {
      async function loadResourcesAndDataAsync() {
        try {
          SplashScreen.preventAutoHide();
          const savedStateString = await AsyncStorage.getItem('PERSISTENCE_KEY');
          const state = JSON.parse(savedStateString);
          setInitialNavigationState(state);
        } catch (e) {
          console.warn(e);
        } finally {
          setLoadingComplete(true);
          SplashScreen.hide();
        }
      }
      loadResourcesAndDataAsync();
    }, []);
    if (!isLoadingComplete) {
      return null;
    } else {
      return (
        <NavigationContainer
          initialState={initialNavigationState}
          onStateChange={(state) =>
            AsyncStorage.setItem('PERSISTENCE_KEY', JSON.stringify(state))
          }
        >
          <MainTabNavigator />
        </NavigationContainer>
      );
    }
    
    &小重點:必須在導覽元件的狀態變數設定完畢(isLoadingComplete=true)的情況下才渲染畫面,要不然導覽元件會將初始畫面的內容設定為最新的導覽狀態!

上一篇
[蚊子的Day22]useEffect+AsyncStorage將狀態變數存在手機裡~React Native
下一篇
[蚊子的Day24]利用記錄上次關閉頁面功能做一個「擬似」登入頁面~React Native
系列文
30天用React native製作app!!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
蔡明達
iT邦新手 5 級 ‧ 2021-09-07 22:24:30

您好,作者能夠透漏在撰寫這些文章的時候參考了哪一些資料嗎?

謝謝您。

我要留言

立即登入留言